ROIPooling
对输入特征图按指定 ROI (Region of Interest) 进行池化操作,将每个 ROI 区域划分为固定大小的池化单元,并取每个通道的最大值输出。
\[ \begin{align}\begin{aligned}\text{pooled\_height} = \left\lceil \frac{\text{roi\_end\_h} - \text{roi\_start\_h} + 1}{\text{pooled\_height}} \right\rceil\\\text{pooled\_width} = \left\lceil \frac{\text{roi\_end\_w} - \text{roi\_start\_w} + 1}{\text{pooled\_width}} \right\rceil\\\text{pooled\_output}[i,j,c] = \max_{h,w \in \text{bin}(i,j)} \text{input}[\text{roi\_start\_h}+h, \text{roi\_start\_w}+w, c]\end{aligned}\end{align} \]
其中:
( text{bin}(i,j) ) 表示第 (i) 行、第 (j) 列池化单元对应的输入特征图区域。
(c) 表示通道索引。
- 输入:
in_ptr - 输入特征图地址。
input_n - 输入批大小。
input_h - 输入高度。
input_w - 输入宽度。
input_c - 输入通道数。
num_rois - ROI 数量。
scale - ROI 缩放因子。
pooled_height - 池化输出高度。
pooled_width - 池化输出宽度。
roi - ROI 坐标数组,格式为 [batch_index, x1, y1, x2, y2]。
core_mask - 核掩码(仅适用于共享存储版本)。
- 输出:
out_ptr - 池化输出地址。
max_c - 每通道最大值缓冲区,用于计算池化结果。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持fp, int8
MT7004 支持hp, fp
共享存储版本:
-
void fp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c, int core_mask)
-
void hp_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c, int core_mask)
-
void i8_roipooling_s(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c, int core_mask)
C调用示例:
1#include <stdio.h>
2#include <roipooling.h>
3
4int main() {
5 float *input = (float *)0xA0000000; // 输入在DDR空间
6 float *output = (float *)0xC0000000;
7 float max_c[64]; // 通道数假设为64
8 float roi[10*5]; // 10个ROI示例
9 int num_rois = 10;
10 int core_mask = 0xff;
11
12 fp_roipooling_s(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c, core_mask);
13 return 0;
14}
私有存储版本:
-
void fp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const float *in_ptr, float *out_ptr, const float *roi, float *max_c)
-
void hp_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const half *in_ptr, half *out_ptr, const half *roi, half *max_c)
-
void i8_roipooling_p(int input_n, int input_h, int input_w, int input_c, int num_rois, float scale, int pooled_height, int pooled_width, const int8_t *in_ptr, int8_t *out_ptr, const float *roi, int8_t *max_c)
C调用示例:
1#include <stdio.h>
2#include <roipooling.h>
3
4int main() {
5 float *input = (float *)0x10810000; // 输入在L2空间
6 float *output = (float *)0x10820000;
7 float max_c[64];
8 float roi[10*5];
9 int num_rois = 10;
10
11 fp_roipooling_p(1, 32, 32, 64, num_rois, 1.0f, 7, 7, input, output, roi, max_c);
12 return 0;
13}